home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / ispell-wrapper < prev    next >
Text File  |  2009-05-15  |  7KB  |  251 lines

  1. #!/usr/bin/perl -w
  2.  
  3. use Debian::DictionariesCommon q(:all);
  4. use Getopt::Long;
  5. Getopt::Long::Configure(pass_through,no_auto_abbrev);
  6.  
  7. # Autoflush output buffers
  8. $|=1;
  9.  
  10. # Function to convert ISO-8859-1 (latin1) accented characters to
  11. # non-accented one.  Of course, this only works for west European
  12. # languages.  We might try to find a more general solution based on
  13. # the current locale character set.
  14.  
  15. sub isoconv {
  16.   my $s = shift;
  17.   $s =~ y{A-Z┴╔═╙┌▌ßΘφ≤·²└╚╠╥┘αΦ∞≥∙┬╩╬╘█ΓΩε⌠√─╦╧╓▄Σδ∩÷▀ⁿ ├╟╨╤╒πτ±⌡┼╞╪σµ°}
  18.          {a-zaeiouyaeiouyaeiouaeiouaeiouaeiouaeiouaeiosuyacdnoacnoaeoaeo};
  19.   return $s;
  20. }
  21.  
  22. #
  23. # Function to try getting $lang after emacsen name 
  24. #
  25.  
  26. sub try_emacsen () {
  27.     return unless ( $emacsen );
  28.     my @available_emacsen = ();
  29.     foreach $k (keys %$dictionaries) {        
  30.     my $language = $dictionaries->{$k}; 
  31.     my $hashname = $language->{"hash-name"};
  32.     my $emacsenname = exists $language->{"emacsen-name"} ?
  33.         $language->{"emacsen-name"} : $hashname;
  34.     return $k if ( lc($emacsen) eq lc($emacsenname) );
  35.     push @available_emacsen,$emacsenname;
  36.     }
  37.     print STDERR "Available emacs dict names are:\n";
  38.     foreach ( sort @available_emacsen ){
  39.     print STDERR "    $_\n";
  40.     }
  41.     die "$0: Selected emacs dict name [$emacsen] 
  42. does not match any of the available values\n";
  43. }
  44.  
  45. #
  46. # Function to try getting $lang after $regexp 
  47. #
  48.  
  49. sub try_regexp () {
  50.     return unless $regexp;
  51.     my @regexp_matches    = ();
  52.     $regexp = isoconv ($regexp);
  53.     foreach $key ( keys %$dictionaries ) {
  54.     $_ = isoconv ( $key );
  55.     push (@regexp_matches, $key)
  56.         if /$regexp/;
  57.     }
  58.     if (scalar @regexp_matches == 1){
  59.     return $regexp_matches[0];
  60.     } elsif ( scalar @regexp_matches == 0 ) {
  61.     die "$0: No installed language matched `$regexp'\n";
  62.     } else {
  63.     die ("$0: More than one installed languages matched `$regexp':\n  "
  64.          . join ("\n  ", @regexp_matches) . "\n");
  65.     }
  66. }
  67.  
  68. # --------------------------------------------------------------------
  69. # Now the main program
  70. # --------------------------------------------------------------------
  71.  
  72. my $lang           = '';
  73. my $class          = "ispell";
  74. my $cli_opts       = "";
  75.  
  76. $dictionaries   = loaddb ("ispell");
  77.  
  78. # In the POD section below there is an extensive description on the
  79. # priority order for determining the ispell language.
  80.  
  81. $emacsen    = '';
  82. $regexp     = '';
  83. my $dryrun  = '';
  84.  
  85. GetOptions ('emacs=s'    => \$emacsen,
  86.         'language=s' => \$regexp,
  87.         'dry-run'    => \$dryrun);
  88.  
  89. die " ispell-wrapper is a wrapper to ispell, but ispell is not installed.\n"
  90.     unless ( -x "/usr/bin/ispell" );
  91.  
  92. $regexp = $ENV{ISPELLDEFAULT} unless $regexp;
  93.  
  94. $regexp =~ s/([^\\]|^)(\(|\))/$1\\$2/g if $regexp;   # Make sure () are escaped
  95.  
  96. $lang = &try_emacsen ()
  97.     ||  &try_regexp ()
  98.     ||  &getuserdefault ()
  99.     ||  &getsysdefault ();
  100.  
  101. print STDERR " Warning: --language=$regexp will be overriden by 
  102.           --emacs=$emacsen setting\n\n"
  103.     if ( defined $lang && $regexp && $emacsen );
  104.  
  105. $ispell_wrapper_args = &dc_get_spellchecker_params($class,$dictionaries->{$lang});
  106.  
  107. # Ignore $lang results if -d is set from commandline
  108.  
  109. foreach ( @ARGV ) { 
  110.     if (/^\-d/){
  111.     $ispell_wrapper_args = "";
  112.     }
  113.     $cli_opts .= " $_";
  114. }
  115.  
  116. print STDERR "Warning: \'$lang\' values overriden with \'$cli_opts\'\n"
  117.     if ( not $ispell_wrapper_args && defined $lang );
  118.  
  119. $command_to_run = "ispell $ispell_wrapper_args $cli_opts";
  120.  
  121. if ( $dryrun ){
  122.     print "--\n$command_to_run\n--\n";
  123. } else {
  124.     exec $command_to_run;
  125. }
  126.  
  127. # Local Variables:
  128. # perl-indent-level: 2
  129. # End:
  130.  
  131. __END__
  132.  
  133. =head1 NAME
  134.  
  135. B<ispell-wrapper> - smart wrapper for ispell
  136.  
  137. =head1 SYNOPSIS
  138.  
  139.  ispell-wrapper [--emacs=name] [--language=regexp] [--dry-run] [ispell options] file
  140.  
  141.    Options (all long only options):
  142.     --emacs=name           Set the language to use by emacs dict name
  143.     --language=regexp      Set the language to use by name
  144.     --dry-run              Only show what would have done
  145.  
  146. =head1 DESCRIPTION
  147.  
  148. B<ispell-wrapper> is a wrapper script for ispell intended to be used
  149. in a Debian system in conjunction with the infrastructure introduced by
  150. the dictionaries-common package. Option --dry-run will show the string
  151. to be run without doing anything else.
  152.  
  153. It automatically sets the B<-d>, B<-w>, and B<-T> options to ispell as a
  154. function of the chosen language.  Of course, this only works for dictionary
  155. packages that comply with the above mentioned Policy.
  156.  
  157. Here is how the language is defined (in order of priority):
  158.  
  159. =over
  160.  
  161. =item 1)
  162.  
  163. By matching the emacs dict name given in --emacs option to the name of 
  164. one of the emacs dicts names provided by installed languages in the 
  165. system. This match must be exact (although is case insensitive). 
  166. Note that this will override any value given in the --language option.
  167.  
  168. =item 2)
  169.  
  170. By matching the regexp given in option --language to the list of
  171. installed languages in the system.
  172.  
  173. =item 3)
  174.  
  175. By matching the regexp stored in the environment variable
  176. ISPELLDEFAULT to the list of installed languages in the system.
  177.  
  178. =item 4)
  179.  
  180. By using the value stored in the user-specific file ~/.ispell-default
  181. (use select-default-iwrap(1) to set it).
  182.  
  183. =item 5)
  184.  
  185. By using the value stored in the site-wide file
  186. /etc/dictionaries-common/ispell-default (use select-default-ispell(8)
  187. as superuser to set it).
  188.  
  189. =back
  190.  
  191. Note: regexp matches are case-insensitive and the ISO-8859-1 special
  192. characters are transformed into their ASCII equivalents.  German
  193. ess-zet is equivalent to the character "s" and the ae ligature to the
  194. character "e".
  195.  
  196. =head1 EXAMPLE
  197.  
  198. Let us say that the following dictionaries are installed in the system
  199. (as appearing in the Debconf question at installation time):
  200.  
  201.     castellano (Spanish TeX mode)
  202.     castellano8 (Spanish 8 bit)
  203.     portuguΩs (European Portuguese)
  204.     portuguΩs brasileiro (Brazilian Portuguese)
  205.  
  206. Choosing the regexp (either in the --language option or in the
  207. environment variable ISPELLDEFAULT) to be "span" will yield an error,
  208. since two languages will match ("castellano" and "castellano8").
  209. However, if the regexp is "span.*8", the language "castellano8
  210. (Spanish 8 bit)" will be chosen.
  211.  
  212. =head1 ENVIRONMENT
  213.  
  214. =over
  215.  
  216. =item ISPELLDEFAULT
  217.  
  218. Regexp that matches the name of the default language to use, if no
  219. --language option is given.
  220.  
  221. =back
  222.  
  223.  
  224. =head1 FILES
  225.  
  226. =over
  227.  
  228. =item $HOME/.ispell-default
  229.  
  230. Contains the name of the language to use, if no --language option is
  231. given or if the ISPELLDEFAULT environment variable is not set.  This
  232. is a user-specific choice.
  233.  
  234. =item /etc/dictionaries-common/ispell-default
  235.  
  236. Name of the language to use when everything above is not set. This is
  237. a system-wide setting.
  238.  
  239. =back
  240.  
  241.  
  242. =head1 SEE ALSO
  243.  
  244. select-default-ispell(8), select-default-iwrap(1)
  245.  
  246. =head1 AUTHORS
  247.  
  248. Rafael Laboissiere
  249.  
  250. =cut
  251.